Technote 1083

Weak-Linking to a Code Fragment Manager-based Shared Library


ñ⁄éü

å√Ç¢ï˚ñ@: Gestalt ÉZÉåÉNÉ^ÇÉCÉìÉXÉgÅ[ÉãǵǃÉgÉâÉbÉvÉeÅ[ÉuÉãÇåƒÇ—èoÇ∑

êVǵǢï˚ñ@: ã§óLÉâÉCÉuÉâÉä

ÉâÉCÉuÉâÉäÉCÉìÉ|Å[ÉgÇÃÉ`ÉFÉbÉN

Gestalt ÇæÇØÇ≈ÇÕè\ï™Ç≈ÇÕǻǢ

óvñÒ
QickTimeÅAQuickDraw 3DÅAApple Game SprocketsÅAÇ®ÇÊÇ— Color Picker ǻǫÅAMac OS ÇÃëΩÇ≠ÇÃïîï™ÇÕÅAåªç›ÅAã§óLÉâÉCÉuÉâÉäÇΔǵǃîzïzÇ≥ÇÍǃǢNjÇ∑ÅBDZÇÃÇΩÇflÅAÇΩǢǃǢÇÃèÍçáÅAì¡íËÇÃÉeÉNÉmÉçÉWÅ[Ç™ë∂ç›Ç∑ÇÈǩǫǧǩÇçló∂Ç∑ÇÈDZÇΔÇ»Ç≠ÅAÉfÉxÉçÉbÉpÇÕñ⁄ìIÇÃÉeÉNÉmÉçÉWÅ[ÇégópÇ∑ÇÈDZÇΔÇ™Ç≈Ç´Ç‹Ç∑ÅBDZÇÍÇ‹Ç≈ÅAApple Ç≈ÇÕÇ≥NjǥNjǻÉeÉNÉmÉçÉWÅ[Çã§óLÉâÉCÉuÉâÉäâªÇµÇƒÇ´Ç‹ÇµÇΩÇ™ÅAåªç›ÅACFM (Code Fragment Manager) ÇÃïWèÄâªÇêiÇflǃǢNjÇ∑ÅBDZÇà TECHNOTE Ç≈ÇÕÅACFM ÉxÅ[ÉXÇÃã§óLÉâÉCÉuÉâÉäÇΔÇÃä‘Ç…é„Ç¢ÉäÉìÉN (Weak-link) Çê›íËÇ∑ÇÈï˚ñ@ÅAÇ®ÇÊÇ—é¿çséûÇ…ÉâÉCÉuÉâÉäÇ™égópÇ≈Ç´ÇÈǩǫǧǩÇÉ`ÉFÉbÉNÇ∑ÇÈï˚ñ@DžǬǢǃê‡ñæÇµÇ‹Ç∑ÅB

DZÇà TECHNOTE ÇÕÅAã§óLÉâÉCÉuÉâÉäÇégópǵǃǢÇÈÇ∑Ç◊ǃÇà Macintosh ÉfÉxÉçÉbÉpÇ…ñóßÇøÇ‹Ç∑ÅB


å√Ç¢ï˚ñ@: Gestalt ÉZÉåÉNÉ^ÇÉCÉìÉXÉgÅ[ÉãǵǃÉgÉâÉbÉvÉeÅ[ÉuÉãÇåƒÇ—èoÇ∑
ÉNÉâÉVÉbÉNÇ» 68K ÉÇÉfÉãÇ≈ÇÕÅAÇ∑Ç◊ǃÇÃÉVÉXÉeÉÄä÷êîÇÕÉgÉâÉbÉvÉeÅ[ÉuÉãåoóRÇ≈é¿çsÇ≥ÇÍÇ‹Ç∑ÅBêVǵǢÉVÉXÉeÉÄÉ\ÉtÉgÉEÉFÉAÇÃã@î\ÇÕÅAǪÇÍÇ‹Ç≈ñ¢égópÇæÇ¡ÇΩÉeÅ[ÉuÉãÇÃÉZÉNÉVÉáÉìÇ…íPèÉÇ…é©ï™é©êgÇÉpÉbÉ`ǵNjÇ∑ÅBDZÇÍÇÁÇÃã@î\ÇÉAÉvÉäÉPÅ[ÉVÉáÉìÇ≈égópÇ∑ÇÈÇΩÇflÅAÉVÉXÉeÉÄÉ\ÉtÉgÉEÉFÉAÇÃǪÇÍǺÇÍÇÃïîï™ÇÕ Gestalt ÉZÉåÉNÉ^ÇÉCÉìÉXÉgÅ[ÉãǵNjÇ∑ÅBì¡íËÇÃã@î\Ç™égópâ¬î\Ç≈džÇÈǩǫǧǩÇÉ`ÉFÉbÉNÇ∑ÇÈÉAÉvÉäÉPÅ[ÉVÉáÉìÇ≈ÇÕÅAGestalt åƒÇ—èoǵÇé¿çsǵǃÅAëŒâûÇ∑ÇÈÉZÉåÉNÉ^Ç™ÉCÉìÉXÉgÅ[ÉãÇ≥ÇÍǃǢÇÈǩǫǧǩÇämîFǵNjÇ∑ÅBÇΩÇΔǶnjÅAQuickTime ÇÉ`ÉFÉbÉNÇ∑ÇÈÉRÅ[ÉhÇÕéüÇÃÇÊǧDžǻÇËÇ‹Ç∑ÅB

theErr = Gestalt (gestaltQuickTime, &result);
if (theErr != noErr)
	return false;
else
	return true;


ç≈èIìIÇ…ÅA2 ǬÇÃÉeÉXÉgÇé¿çsÇ∑ÇÈDZÇΔÇ™Ç≈Ç´Ç‹Ç∑ÅBàÍǬÇÕÉ}ÉlÅ[ÉWÉÉÇ™égópâ¬î\Ç≈džÇÈǩǫǧǩÇÃÉeÉXÉgÇ≈džÇËÅALJǧàÍǬÇÕÅA32 ÉrÉbÉg QuickDraw Ç™égópâ¬î\Ç≈džÇÈǩǫǧǩÇΔǢǡÇΩÅAǪÇÃÉ}ÉlÅ[ÉWÉÉÇÃì‡ïîÇ≈ì¡íËÇÃã@î\ÇégópÇ≈Ç´ÇÈǩǫǧǩÇÃÉeÉXÉgÇ≈Ç∑ÅB2 î‘ñ⁄ÇÃÉeÉXÉgÇÃèÍçáÅAGestalt ÉrÉbÉgÇégǡǃÅAëŒè€ÇΔÇ»ÇÈã@î\Çà "É`ÉÉÉìÉN" ÇéØï Ç∑ÇÈÇΔǢǧÉAÉvÉçÅ[É`ï˚ñ@ÇÇΔÇËÇ‹Ç∑ÅB


å√Ç¢ÉÇÉfÉãÇÃñ‚ëËì_
DZǧǵÇΩå√Ç¢ÉÇÉfÉãÇ≈ÇÕÇ≥NjǥNjǻñ‚ëËÇ™î≠ê∂ǵǃǢNjǵÇΩÅBÇ‹Ç∏àÍǬÇÕÅAÉgÉâÉbÉvÉeÅ[ÉuÉãÇÃÉçÉPÅ[ÉVÉáÉìÇÃêîÇ…êßå¿Ç™Ç†ÇËÅAç≈èIìIÇ…égópâ¬î\Ç»ÉçÉPÅ[ÉVÉáÉìǙǻÇ≠ǻǡǃǵNjǧÇΔǢǧñ‚ëËÇ≈Ç∑ÅBDZÇÃñ‚ëËÇâÒîÇ∑ÇÈÇΩÇflÇ…ÅAìKêÿÇ»ÉãÅ[É`ÉìÇëIëÇ∑ÇÈÇΩÇflÇ…å¬ï ÇÃÉZÉåÉNÉ^ÉpÉâÉÅÅ[É^ÇégǡǃÅAï°êîÇÃÉVÉXÉeÉÄÉRÅ[ÉãǙǵnjǵnjíPàÍÇÃÉgÉâÉbÉvÇÃíÜÇ…íuÇ©ÇÍǃǢNjǵÇΩÅBÇΩÇæÇµÅADZÇÃëŒèàï˚ñ@ÇÃåãâ ÅAÉVÉXÉeÉÄÉ\ÉtÉgÉEÉFÉAÇÃÉoÉOÇÉtÉBÉbÉNÉXÇ∑ÇÈã@î\Ç…êßå¿Ç™â¡Ç¶ÇÁÇÍÅAÉZÉåÉNÉ^ÉxÅ[ÉXÇÃÉgÉâÉbÉvDžǧNjÇ≠ÉpÉbÉ`ÇìñǃÇÈDZÇΔÇ™ç¢ìÔDžǻǡǃǢNjǵÇΩÅB

Ç‹ÇΩï ÇÃñ‚ëËÇΔǵǃÅAëÂïîï™ÇÃÉpÉbÉ`Ç™ã@î\ägí£ÇÃÉçÅ[ÉhéûÅAǬNjÇËÅAã@î\ägí£Ç™ÉVÉXÉeÉÄÉqÅ[ÉvÇ…ì«Ç›çûÇ‹ÇÍÇÈÇΔÇ´Ç…ÉçÅ[ÉhÇ≥ÇÍÇÈïKóvǙdžÇËNjǵÇΩÅBǪÇÃåãâ ÅADZÇÍÇÁÇÃÉAÉCÉeÉÄÇÕÉAÉvÉäÉPÅ[ÉVÉáÉìÇ…ÇÊǡǃégópÇ≥ÇÍǻǢèÍçáÇ≈LJÉçÅ[ÉhÇ≥ÇÍÇÈDZÇΔÇ…Ç»ÇËÇ‹Ç∑ÅB

âºëzÉÅÉÇÉäÇ™Ågì¸ÅhDžǻǡǃǢÇÈèÍçáÅAÉVÉXÉeÉÄÉqÅ[ÉvÇ…ä÷òAÇ∑ÇÈÉÅÉÇÉäÇÃÉuÉçÉbÉNÇÉnÅ[ÉhÉfÉBÉXÉNÇ…ÉXÉèÉbÉvÇ∑ÇÈDZÇΔÇÕãñâ¬Ç≥ÇÍǃǢNjÇπÇÒÅBDZÇÍÇÕÅAÉhÉâÉCÉoǂǪÇÃëºÅAÉRÅ[ÉhÇÃèdóvïîï™ÇÉXÉèÉbÉvÇ≈ǴǻǢÇÊǧDžÇ∑ÇÈÇΩÇflÇ≈Ç∑ÅBǪÇÃåãâ ÅAÉVÉXÉeÉÄÉqÅ[ÉvÇÃÉTÉCÉYÇ™ãêëÂâªÇµÇƒÅAâºëzÉÅÉÇÉäÇ≈égópâ¬î\Ç»ÉÅÉÇÉäóeó Ç…èdëÂÇ»êßå¿Ç™â¡Ç¶ÇÁÇÍÇÈDZÇΔÇ…Ç»ÇËÇ‹Ç∑ÅBDZÇÍÇÕÅAÉÅÉÇÉäÇΔÉnÅ[ÉhÉfÉBÉXÉNÇΔÇÃä‘Ç≈ÉRÅ[ÉhÇ‚ÉfÅ[É^ÇÃÉXÉèÉbÉvÇ…óvÇ∑ÇÈéûä‘Ç™í∑Ç≠Ç»ÇËÅAÉpÉtÉHÅ[É}ÉìÉXÇ™í·â∫Ç∑ÇÈDZÇΔÇà”ñ°ÇµÇ‹Ç∑ÅB

Ç≥ÇÁÇ…ÅAÉAÉvÉäÉPÅ[ÉVÉáÉìà»äOÇÃÉRÅ[ÉhÇÃàÍïîÇ…ä‹Ç‹ÇÍÇÈÉOÉçÅ[ÉoÉãïœêîÇÃÉCÉìÉvÉäÉÅÉìÉgÇ‚ÉAÉNÉZÉXÇ™ç¢ìÔÇ…Ç»ÇÈÇΔǢǧñ‚ëËLJdžÇËNjǵÇΩÅB

å√Ç¢ÉÇÉfÉãÇ…î∫ǧDZÇÃÇÊǧǻêßå¿ÇÃÇΩÇflÅAêVǵǢÉÇÉfÉãÇ™ïKóvÇ≈džÇÈÇΔǢǧDZÇΔÇ™ñæÇÁǩDžǻÇËNjǵÇΩÅB


êVǵǢï˚ñ@: ã§óLÉâÉCÉuÉâÉä
êVǵǢÉÇÉfÉãÇ≈ÇÕÅAã§óLÉâÉCÉuÉâÉäÇÃàÍå`ë‘Ç≈džÇÈÉRÅ[ÉhÉtÉâÉOÉÅÉìÉg (Code Fragment) ÇégópǵNjÇ∑ÅBÉRÅ[ÉhÇÃÇ∑Ç◊ǃÇÃå`ë‘ÇÕÅAÉRÅ[ÉhÉtÉâÉOÉÅÉìÉgÇΔǵǃàÍä—ǵǃÉpÉbÉPÅ[ÉWÇ≥ÇÍÅAÉOÉçÅ[ÉoÉãïœêîÇ÷ÇÃÉtÉãÉAÉNÉZÉXÇ™â¬î\Ç…Ç»ÇËÇ‹Ç∑ÅBâºëzÉÅÉÇÉäÇ™ Power Mac Ç≈égópÇ≥ÇÍǃǢÇÈÇΔÇ´ÅAÉtÉâÉOÉÅÉìÉgÇÕÉÅÉÇÉäÇÃíÜÇ…ÉtÉ@ÉCÉãÉ}ÉbÉvÇ≥ÇÍÅAì«Ç›çûÇ›êÍópÇΔǵǃÉ}Å[ÉNÇ≥ÇÍÇ‹Ç∑ÅBǪÇÃåãâ ÅAÉÅÉÇÉäÇÃégópÇ™ÇÊÇËå¯ó¶ìIÇ…Ç»ÇËÅAÉvÉçÉOÉâÉ~ÉìÉOÉGÉâÅ[Ç…ëŒÇ∑ÇÈdžÇÈíˆìxÇÃï€åÏÇ™â¬î\Ç…Ç»ÇËÇ‹Ç∑ÅB

ÉtÉâÉOÉÅÉìÉgÇ™ÉVÉXÉeÉÄÉ\ÉtÉgÉEÉFÉAÇÃã@î\Ç…ÉAÉNÉZÉXÇ∑ÇÈïKóvǙdžÇÈèÍçáÅAǪÇÍÇÁÇÃã@î\Çï ÇÃÉâÉCÉuÉâÉäÇ©ÇÁÉCÉìÉ|Å[ÉgǵNjÇ∑ÅBÉVÉXÉeÉÄÉ\ÉtÉgÉEÉFÉAÇÃÇΩǢǃǢÇÃïîï™ÇÕÅAInterfaceLib ÇΔǢǧñºëOÇÃÉâÉCÉuÉâÉäÇ©ÇÁÉCÉìÉ|Å[ÉgÇ≥ÇÍÇ‹Ç∑ÅBàÍï˚ÅAǪÇÃëºÇÃïîï™ (QuickTimeÅAQuickDraw 3D ǻǫ) Ç≈ÇÕÅAǪÇÍÇÁÇÃã@î\ÇÃÇ∑Ç◊ǃǙìΔé©ÇÃÉâÉCÉuÉâÉäÇ…íuÇ©ÇÍǃǢNjÇ∑ÅB


ã≠Ç¢ÉäÉìÉN (Strong-link)
ÉfÉtÉHÉãÉgÇÃê›íËÇ≈ÅAÇ∑Ç◊ǃÇÃÉCÉìÉ|Å[ÉgÉâÉCÉuÉâÉäÇ…ÇÕã≠Ç¢ÉäÉìÉNÇ™ê›íËÇ≥ÇÍǃǢNjÇ∑ÅBǬNjÇËÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÇãNìÆÇ∑ÇÈÇΩÇflÇ…ÇÕÅAǪÇÃÉAÉvÉäÉPÅ[ÉVÉáÉìÇ≈ǪÇÍÇÁÇÃÉâÉCÉuÉâÉäÇ™égópâ¬î\Ç≈Ç»ÇØÇÍnjǻÇËÇ‹ÇπÇÒÅBCFM ÉxÅ[ÉXÇÃÉAÉvÉäÉPÅ[ÉVÉáÉìÇãNìÆÇ∑ÇÈÇΔÇ´ÅAǪÇÃÉAÉvÉäÉPÅ[ÉVÉáÉìÇ≈ÇÕÇ∑Ç◊ǃÇÃÉâÉCÉuÉâÉäÇÉCÉìÉ|Å[ÉgǵÇÊǧÇΔǵNjÇ∑ÅBÉAÉvÉäÉPÅ[ÉVÉáÉìÇ™ã≠Ç¢ÉäÉìÉNÇÃÉâÉCÉuÉâÉäÇèÄîıÇ≈ǴǻǢèÍçáÅAFinder Ç≈ÇÕéüÇÃÇÊǧǻÉGÉâÅ[ÉÅÉbÉZÅ[ÉWÇï\é¶ÇµÇ‹Ç∑ÅB

The Application "MoofWars" could not be opened because "DrawSprocketLib"
could not be found.

íçà”: DZÇÃÉÅÉbÉZÅ[ÉWÇÕÉAÉvÉäÉPÅ[ÉVÉáÉìÇ≈ÇÕÇ»Ç≠ÅACFM ã§óLÉâÉCÉuÉâÉäÇ…ìKópÇ≥ÇÍÇ‹Ç∑ÅB


é„Ç¢ÉäÉìÉN (Weak-link)
ÉAÉvÉäÉPÅ[ÉVÉáÉìÇ≈ÇÕÅAÉâÉCÉuÉâÉäÇ…é„Ç¢ÉäÉìÉNÇ™ê›íËÇ≥ÇÍǃǢÇÈDZÇΔÇéwíËÇ≈Ç´Ç‹Ç∑ÅBÉâÉCÉuÉâÉäÇ…é„Ç¢ÉäÉìÉNÇ™ê›íËÇ≥ÇÍǃǢÇÈÇΔÅAǪÇÃÉâÉCÉuÉâÉäÇ™égópâ¬î\Ç≈ǻǩǡÇΩÇËÅAÉÅÉÇÉäÇÃêßå¿ÇÃÇΩÇflÇ…èÄîıÇ≈ǴǻǢèÍçáÇ≈LJÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÇãNìÆÇ≈Ç´Ç‹Ç∑ÅBé„Ç¢ÉâÉCÉuÉâÉäÇ™å©Ç¬Ç©ÇÁǻǢÇΔÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÇ™çƒãNìÆÇ≥ÇÍÇÈÇ‹Ç≈ÅAǪÇÃÉâÉCÉuÉâÉäÇÕå©Ç¬Ç©ÇÁǻǢNjNjÇΔÇ»ÇËÇ‹Ç∑ÅBé„Ç¢ÉäÉìÉNÇÕÉCÉìÉ|Å[ÉgÇÃåƒÇ—èoǵéûÉoÉCÉìÉfÉBÉìÉOÇÃë„ópÇ≈ÇÕdžÇËÇ‹ÇπÇÒÅBCFM ÇæÇØÇ™ÉCÉìÉ|Å[ÉgÇÃèÄîıéûÉoÉCÉìÉfÉBÉìÉOÇçsǢNjÇ∑ÅBé„Ç¢ÉäÉìÉNÇ™ê›íËÇ≥ÇÍÇΩÉâÉCÉuÉâÉäÇégópÇ∑ÇÈÇΩÇflÇ…ÇÕÅAǪÇÃÉâÉCÉuÉâÉäÇ™èÄîıÇ≥ÇÍǃǢÇÈǩǫǧǩÇîªíËÇ∑ÇÈïKóvǙdžÇËÇ‹Ç∑ÅB

ÉCÉìÉ|Å[ÉgÇ≥ÇÍÇÈÉâÉCÉuÉâÉäëSëÃÇé„Ç¢ÇΔÉ}Å[ÉNÇ∑ÇÈDZÇΔÇ™Ç≈Ç´Ç‹Ç∑ÅBDZÇÍÇÕÅAǪÇÃÉâÉCÉuÉâÉäǙNjǡÇΩÇ≠å©Ç¬Ç©ÇÁǻǢDZÇΔLJdžÇËǧÇÈÇΔǢǧà”ñ°Ç≈Ç∑ÅBå¬ï ÇÃÉCÉìÉ|Å[ÉgÉVÉìÉ{ÉãÇé„Ç¢ÇΔÉ}Å[ÉNÇ∑ÇÈDZÇΔLJÇ≈Ç´Ç‹Ç∑ÅBDZÇÍÇÕÅAǪÇÍÇÁÇÃÉVÉìÉ{ÉãÇ™å¬ï Ç…å©Ç¬Ç©ÇÁǻǢDZÇΔǙdžÇËǧÇÈÇΔǢǧà”ñ°Ç≈Ç∑ÅBÉâÉCÉuÉâÉäÇé„Ç¢ÇΔÉ}Å[ÉNÇ∑ÇÈDZÇΔÇÕÅAǪÇÃÉâÉCÉuÉâÉäÇÃÉVÉìÉ{ÉãÇ∑Ç◊ǃǙé„Ç¢ÇΔǢǧDZÇΔÇà√ñŸìIÇ…É}Å[ÉNǵǃǢÇÈDZÇΔÇ…Ç»ÇËÇ‹Ç∑ÅB

íçà”: CFM ÇÃÉCÉìÉvÉäÉÅÉìÉeÅ[ÉVÉáÉìÇ©ÇÁǵǃÅADZÇÃãtÇÕï∂éöí ÇËÇ…ÇÕê^Ç≈ÇÕdžÇËÇ‹ÇπÇÒÅBã≠Ç¢ÉâÉCÉuÉâÉäÇ©ÇÁÉCÉìÉ|Å[ÉgÇ≥ÇÍÇΩÇ∑Ç◊ǃÇÃÉVÉìÉ{ÉãÇ™é„Ç¢èÍçáÇ≈LJÅAã≠Ç¢ÉâÉCÉuÉâÉäÇÕégópâ¬î\Ç≈Ç»ÇØÇÍnjǻÇËÇ‹ÇπÇÒÅBÇ¢ÇÌljÇÈ "ÉXÉ}Å[Ég" ÉäÉìÉJÇ…ÇÊÇËÅAÉCÉìÉ|Å[ÉgÇ≥ÇÍÇÈÇ∑Ç◊ǃÇÃÉVÉìÉ{ÉãÇ™é„Ç≠ÅAǩǬÉâÉCÉuÉâÉäëSëÃLJé„Ç¢ÇΔÉ}Å[ÉNÇ∑ÇÈDZÇΔÇ™â¬î\Ç…Ç»ÇËÇ‹Ç∑ÅB

CFM Çà "ÉCÉìÉvÉäÉÅÉìÉgÇÃè⁄ç◊" ÇÃíÜÇ…ÇÕÅAǪÇÃìÆçÏÇ™àÍä—ǵǃǢǻǢÇÊǧDžå©Ç¶ÇÈLJÇÃǙdžÇËÇ‹Ç∑ÅBåªç›ÅAÉCÉìÉ|Å[ÉgÉâÉCÉuÉâÉäÇéØï Ç∑ÇÈÇΔÇ´Ç…î≠ê∂Ç∑ÇÈëÂïîï™ÇÃÉGÉâÅ[ÇÕÅAé„Ç¢ÉâÉCÉuÉâÉäÇí âflÇ≥ÇπǃǵNjǢNjÇ∑ÅBDZǧǵÇΩèÛãµÇÕè´óàïœçXÇ≥ÇÍÅAǪÇÃåãâ ÅAé„Ç¢ÉâÉCÉuÉâÉäÇÕï∂éöí ÇËå©Ç¬Ç©ÇÁǻǢDZÇΔÇæÇØÇãñâ¬Ç≥ÇÍÇÈÇÊǧDžǻÇËÇ‹Ç∑ÅBÉâÉCÉuÉâÉäÇ™ê≥èÌÇ…åüèoÇ≥ÇÍÇÈÇΔÅAǪÇÃëºÇ∑Ç◊ǃÇÃÉGÉâÅ[ÇÕívñΩìIǻLJÇÃÇΔÇ»ÇËÇ‹Ç∑ÅBDZÇÍÇÕïœçXÇ≥ÇÍÇ‹ÇπÇÒÅBÇΩÇΔǶnjÅAÉâÉCÉuÉâÉäÇÃÉfÅ[É^ÉZÉNÉVÉáÉìÇäÑÇËìñǃÇÈÇΩÇflÇ…è\ï™Ç»ÉAÉvÉäÉPÅ[ÉVÉáÉìÉqÅ[ÉvÉXÉyÅ[ÉXǙǻǢèÍçáÅAèÄîıÇÕé∏îsǵNjÇ∑ÅBÉCÉìÉvÉäÉÅÉìÉeÅ[ÉVÉáÉìÇÃè⁄ç◊ÇÕç°å„ïœçXÇ≥ÇÍÇÈâ¬î\ê´Ç™Ç†ÇÈÇΩÇflÅADZÇà TECHNOTE ÇÃéQçlï∂å£ÅuMacintosh Runtime ArchitecturesÅvÇÃç≈êVÇÃÉhÉâÉtÉgÇéQèΔǵǃÇ≠ÇæÇ≥Ç¢ÅB

äJî≠ä¬ã´Ç…ÇÕÅAé„Ç¢ÉäÉìÉNÇΔÇÃÉCÉìÉ^ÉtÉFÅ[ÉXÇíÒãüÇ∑ÇÈê”îCǙdžÇËÇ‹Ç∑ÅBÇΩÇΔǶnjÅACodeWarrior Ç≈ÇÕÅAÉâÉCÉuÉâÉäëSëÃÇ™é„Ç≠ÉäÉìÉNÇ≥ÇÍÇÈDZÇΔÇæÇØÇãñâ¬ÇµÇ‹Ç∑ÅBDZÇÃÉRÉ}ÉìÉhÇÕÅAǪÇÍǺÇÍÇÃÉ\Å[ÉXÉâÉCÉuÉâÉäÇ…ëŒÇ∑ÇÈÉvÉçÉWÉFÉNÉgÉEÉBÉìÉhÉEÇ…É|ÉbÉvÉAÉbÉvÉÅÉjÉÖÅ[ÇΔǵǃï\é¶Ç≥ÇÍÇ‹Ç∑ÅBDZÇÍÇ…ëŒÇµÇƒ MPW Ç≈ÇÕÅAÉâÉCÉuÉâÉäëSëÃÇ‹ÇΩÇÕå¬ï ÇÃÉVÉìÉ{ÉãÇÉ}Å[ÉNÇ∑ÇÈDZÇΔÇ™Ç≈Ç´Ç‹Ç∑ÅBÉâÉCÉuÉâÉäÇ‹ÇΩÇÕå¬ï ÇÃÉVÉìÉ{ÉãÇÉ}Å[ÉNÇ∑ÇÈï˚ñ@DžǬǢǃÇÕÅAǪÇÍǺÇÍÇÃäJî≠ä¬ã´ÇÃÉ}ÉjÉÖÉAÉãÇéQèΔǵǃÇ≠ÇæÇ≥Ç¢ÅBÇΔǢǧÇÃLJÅAǪÇÍǺÇÍÇÃÉcÅ[ÉãÇ™íÒãüÇ∑ÇÈã@î\ÇÕïpî…Ç…ïœçXÇ≥ÇÍÇÈÇΩÇflÇ≈Ç∑ÅBÇΩÇΔǶnjÅAMPW ÇÕåªç›ÅAå¬ï ÇÃÉVÉìÉ{ÉãÇÇÊÇËóeà’Ç…é„Ç≠ÉäÉìÉNÇ≈Ç´ÇÈÇÊǧDžâ¸í˘Ç≥ÇÍǃǢNjÇ∑ÅB


ÉâÉCÉuÉâÉäÉCÉìÉ|Å[ÉgÇÃÉ`ÉFÉbÉN
ÉRÅ[ÉhÉtÉâÉOÉÅÉìÉgÇ…ÇÕÅAÉCÉìÉ|Å[ÉgÇ∑ÇÈäeÉVÉìÉ{ÉãÇÃÉAÉhÉåÉXÇ™ä‹Ç‹ÇÍǃǢNjÇ∑ÅBÉtÉâÉOÉÅÉìÉgÇ™èÄîıÇ≥ÇÍǃǢÇÈÇΔÇ´ÅACFM Ç≈ÇÕǪÇÃÉAÉhÉåÉXÇì¡íËǵÅAÉ|ÉCÉìÉ^ÇñÑÇflÇ‹Ç∑ÅBC åæåÍÇÃèÍçáÅADZÇÍÇÁÇÃÉ|ÉCÉìÉ^ÇÕÅAÉCÉìÉ|Å[ÉgÇ≥ÇÍÇΩÉãÅ[É`ÉìÇ‹ÇΩÇÕïœêîÇÃÉAÉhÉåÉXÇå©Ç¬ÇØÇÈÇΔÇ´Ç…éÊìæÇ≈Ç´ÇÈLJÇÃÇΔNjǡÇΩÇ≠ìØÇ∂LJÇÃÇ≈Ç∑ÅBÉCÉìÉ|Å[ÉgÇ≥ÇÍÇΩÉVÉìÉ{ÉãÇâåàÇ≈ǴǻǢÇΔÇ´ÅAǪÇÃÉAÉhÉåÉXÇÕÅAkUnresolvedCFragSymbolAddress Ç…ê›íËÇ≥ÇÍÇ‹Ç∑ (DZÇÍÇÕÉ[ÉçÇ≈džÇÈÇΔǢǧDZÇΔÇèÁí∑Ç…ï\é¶ÇµÇƒÇ¢ÇÈÇ…Ç∑ǨNjÇπÇÒ)ÅB

ã§óLÉâÉCÉuÉâÉäÇ™ê≥èÌÇ…èÄîıÇ≥ÇÍǃǢÇÈǩǫǧǩÇÉeÉXÉgÇ∑ÇÈç≈LJàÍî ìIÇ»ï˚ñ@ÇÕÅAÉâÉCÉuÉâÉäÇ…ä‹Ç‹ÇÍÇÈÉVÉìÉ{ÉãÇ 1 ǬéÊÇËèoǵǃÅAǪÇÍÇ kUnresolvedCFragSymbolAddress ÇΔî‰ärÇ∑ÇÈDZÇΔÇ≈Ç∑ÅBÇΩÇΔǶnjÅAQuickDraw 3D ÇΔÇÃä‘Ç…é„Ç¢ÉäÉìÉNÇê›íËǵǃǢÇÈèÍçáÇÕÅAéüÇÃÉRÅ[ÉhÇégǡǃÅAǪÇÍÇ™ê≥èÌÇ…èÄîıÇ≥ÇÍǃǢÇÈǩǫǧǩÇämîFǵNjÇ∑ÅB

#include <QD3D.h>
#include <CodeFragments.h>
Boolean HasQuickDraw3D (void)
{
	return ( (Ptr) Q3Initialize == (Ptr) kUnresolvedCFragSymbolAddress);
}


DZÇÃÉVÉìÉ{ÉãÇÃë∂ç›ÇÕÅAǪÇÃëºÇ∑Ç◊ǃÇÃÉVÉìÉ{ÉãLJégópâ¬î\Ç≈džÇÈDZÇΔÇïKÇ∏ǵLJà”ñ°ÇµÇ‹ÇπÇÒÅBÇΩÇΔǶnjÅAColorSync 1.0 ÇégópǵǃǢǃÅAColorSync 2.0 ÇÃå¬ï ÇÃÉVÉìÉ{ÉãÇΔÇÃä‘Ç…é„Ç¢ÉäÉìÉNÇê›íËǵǃǢÇÈèÍçáÅA2.0 ÇÃÉVÉìÉ{ÉãÇå¬ï Ç…ÉeÉXÉgÇ∑ÇÈDZÇΔÇ…Ç»ÇËÇ‹Ç∑ÅB

ÉâÉCÉuÉâÉäÇÉeÉXÉgÇ∑ÇÈLJǧàÍǬÇÃï˚ñ@ÇÕÅAkFindCFrag ÉIÉvÉVÉáÉìÇégǡǃ GetSharedLibrary ÇåƒÇ—èoÇ∑DZÇΔÇ≈Ç∑ÅBDZÇÍÇçsǧDžÇÕÅAÉâÉCÉuÉâÉäÇà 'cfrg' ÉäÉ\Å[ÉXÇ©ÇÁÉCÉìÉ|Å[ÉgÉâÉCÉuÉâÉäÇÃñºëOÇéÊìæÇ∑ÇÈïKóvǙdžÇËÇ‹Ç∑ÅB


Åu3D Graphics Programming With QuickDraw 3DÅvÇ…é¶Ç≥ÇÍǃǢÇÈÉRÅ[ÉhÇÃèCê≥
è„ÇÃÉRÅ[ÉhÇÕÅAÅu3D Graphics Programming With QuickDraw 3DÅvÇ…é¶Ç≥ÇÍǃǢÇÈÉRÅ[ÉhÇ…éÊǡǃë„ÇÌÇËÇ‹Ç∑ÅBǪÇÃÉRÅ[ÉhÇÕÅAä÷êîÉ|ÉCÉìÉ^Çò_óùílÇ…ÉLÉÉÉXÉgǵǃÅAÉAÉhÉåÉXÇÉeÉXÉgÇ∑ÇÈëOÇ…è„à Çà 24 ÉrÉbÉgÇÉNÉäÉAǵNjÇ∑ÅBéüÇÃÉRÅ[ÉhÇÕÅADZÇÃDZÇΔÇé¶ÇµÇƒÇ¢Ç‹Ç∑ÅB

Boolean BuggyHasQuickDraw3D (void)
{
	return((Boolean) Q3Initialize != kUnresolvedCFragSymbolAddress);
}
00000084: 80C20000 lwz r6,Q3Initialize(RTOC)
00000088: 54C6063E clrlwi r6,r6,24
0000008C: 28060000 cmplwi r6,$0000



Gestalt ÇæÇØÇ≈ÇÕè\ï™Ç≈ÇÕǻǢ
ÉVÉXÉeÉÄÉ\ÉtÉgÉEÉFÉAÇÃÇ¢Ç≠ǬǩÇÃïîï™Ç…ÇÕÅAGestalt åƒÇ—èoǵÇÉCÉìÉXÉgÅ[ÉãÇ∑ÇÈã@î\ägí£Ç™ä‹Ç‹ÇÍǃǢNjÇ∑ÅBÇΩÇΔǶnjÅAQuickTime ÇÕÅACFM Ç®ÇÊÇ—ÉNÉâÉVÉbÉN 68K ÉÇÉfÉãÇÃóºï˚Ç≈é¿çsÇ≈Ç´ÇÈïKóvǙdžÇËÇ‹Ç∑ÅBDZÇÃÇΩÇflÅAQuickTime Ç≈ÇÕÉgÉâÉbÉvÉeÅ[ÉuÉãÇ…ÉpÉbÉ`ÇìñǃÅAGestalt ä÷êîÇÉCÉìÉXÉgÅ[ÉãǵNjÇ∑ÅBQuickDraw 3D DžLJé¿ç€Ç…ÇÕÅAÇ‹Ç≥Ç… Gestalt ÉZÉåÉNÉ^ÇÉCÉìÉXÉgÅ[ÉãÇ∑ÇÈã@î\ägí£ÇÃÉRÅ[ÉhÇ™ä‹Ç‹ÇÍǃǢNjÇ∑ÅB

ÉVÉXÉeÉÄÉ\ÉtÉgÉEÉFÉAÇÃDZÇÍÇÁÇÃïîï™ÇÃÇ¢Ç∏ÇÍÇ©ÇÉCÉìÉ|Å[ÉgÇ∑ÇÈ PowerPC ÉlÉCÉeÉBÉuÇ‹ÇΩÇÕ CFM-68K ÉAÉvÉäÉPÅ[ÉVÉáÉìÇèëǢǃǢÇÈèÍçáÅAGestalt ÉZÉåÉNÉ^ÇÉCÉìÉXÉgÅ[ÉãÇ∑ÇÈDZÇΔÇÕÇ≈Ç´Ç‹Ç∑Ç™ÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÇé¿çsÇ∑ÇÈÇΔÇ´Ç…ÅAÉâÉCÉuÉâÉäÇÕǪÇÃÉAÉvÉäÉPÅ[ÉVÉáÉìÇ≈égópÇ≈Ç´ÇÈÇÊǧDžÇÕÇ»ÇËÇ‹ÇπÇÒÅBDZÇÃÇΩÇflÅAÉâÉCÉuÉâÉäÇΔé„Ç¢ÉäÉìÉNÇçsǡǃǢÇÈèÍçáÇÕÅAGestalt ÉZÉåÉNÉ^ÇΔÉâÉCÉuÉâÉäÉCÉìÉ|Å[ÉgÇÃóºï˚ÇÉ`ÉFÉbÉNÇ∑ÇÈïKóvǙdžÇËÇ‹Ç∑ÅBǪǧǵǻǢÇΔÅAǪÇÃÉâÉCÉuÉâÉäÇ…ä‹Ç‹ÇÍÇÈÉãÅ[É`ÉìÇç≈èâÇ…åƒÇ—èoÇ∑ÇΔÇ´ÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÇÕÉNÉâÉbÉVÉÖǵǃǵNjǢNjÇ∑ÅB

Boolean HasQuickTime (void)
{
	OSErr theErr = noErr;
	long result;

	theErr = Gestalt (gestaltQuickTime, &result);
	if (theErr != noErr)
		return false;

	theErr = Gestalt (gestaltQuickTimeFeatures, &result);
	if (theErr != noErr)
		return false;

	if (!(result & (1 << gestaltPPCQuickTimeLibPresent)))
		return false;

	// QuickTime PowerPlug ÇÃÉGÉìÉgÉäÅ[É|ÉCÉìÉ^ÇÕâåàÇ≥ÇÍǃǢǻǩǡÇΩÇÃÇ≈
	// DZÇÃïîï™ÇÕÅAé„Ç¢ÉäÉìÉNÇê›íËÇ∑ÇÈèÍçáÇæÇØïKóvÇ≈Ç∑ÅB

#if GENERATINGCFM
	return ((Ptr) EnterMovies != (Ptr)kUnresolvedCFragSymbolAddress);
#else
	return true;
#endif
}


åªç›ÅACode Fragment Manager ÇÕ CFM68K ÉâÉìÉ^ÉCÉÄì‡Ç…ë∂ç›ÇµÇ‹Ç∑ÅBDZÇÃÇΩÇflÅAíPÇ… PowerPC Ç…ëŒÇ∑ÇÈÉeÉXÉgÇæÇØÇ≈ÇÕïsè\ï™Ç≈Ç∑ÅBÉwÉbÉ_ÉtÉ@ÉCÉã ConditionalMacros.h Ç≈ÇÕÅAGENERATINGCFM ǻǫÅAÇ¢Ç≠ǬǩÇÃèåèÇÉZÉbÉgÉAÉbÉvǵÅADZÇÍÇÁÇÕ PowerPC Ç‹ÇΩÇÕ CFM68K ÇÃLJÇΔÇ≈ÉRÉìÉpÉCÉãÇ∑ÇÈÇΔÇ´ÅATrue Ç…ÉZÉbÉgÇ≥ÇÍÇ‹Ç∑ÅB#if GENERATINGCFM Ç…ä‹Ç‹ÇÍÇÈé„Ç¢ÉäÉìÉNÇê›íËÇ≥ÇÍÇΩÉVÉìÉ{ÉãÇëŒè€ÇΔǵÇΩÉeÉXÉgÇÉâÉbÉvÇ∑ÇÈDZÇΔÇÕÅAÉeÉXÉgÇèåèâªÇ∑ÇÈè„Ç≈ç≈ìKÇ»ï˚ñ@ÇΔǢǶNjÇ∑ÅB


óvñÒ
Apple Ç≈ÇÕÅACFM (Code Fragment Manager) ÇïWèÄâªÇµÇ‹ÇµÇΩÅBCFM Ç…ÇÊÇËÅAMac OS ÇÃÇ∑Ç◊ǃÇÃÉRÅ[ÉhÇ…àÍä—ǵÇΩÉCÉìÉ^ÉtÉFÅ[ÉXÇ™íÒãüÇ≥ÇÍÇ‹Ç∑ÅBCFM ÇÕ 68K DžLJìKópÇ≥ÇÍÇ‹Ç∑ÅBé„Ç¢ÉäÉìÉN (Weak-link) ÇégópÇ∑ÇÈÇΔÅAì¡íËÇÃÉtÉâÉOÉÅÉìÉgÇ™ï ÇÃÉtÉâÉOÉÅÉìÉgÇ…àÀë∂ǵǻÇ≠Ç»ÇËÇ‹Ç∑ÅBé„Ç¢ÉäÉìÉNÇê›íËÇ≥ÇÍÇΩÉtÉâÉOÉÅÉìÉgÇégópÇ∑ÇÈëOÇ…ÅAǪÇÍÇÁÇ™égópâ¬î\Ç≈džÇÈǩǫǧǩÇÉ`ÉFÉbÉNÇ∑ÇÈïKóvǙdžÇËÇ‹Ç∑ÅB

éQçlï∂å£